package day20180131.testInit;

/**
 * Created by 14394 on 2018/1/31.
 */

/*Java虚拟机规范严格规定了有且只有5种场景必须立即对类进行初始化，这4种场景也称为对一个类进行主动引用（其实还有一种场景，不过暂时我还没弄明白这种场景的意思，就先不写了）：

1、使用new关键字实例化对象、读取或者设置一个类的静态字段（被final修饰的静态字段除外）、调用一个类的静态方法的时候

2、使用java.lang.reflect包中的方法对类进行反射调用的时候

3、初始化一个类，发现其父类还没有初始化过的时候

4、虚拟机启动的时候，虚拟机会先初始化用户指定的包含main()方法的那个类

除了上面4种场景外，所有引用类的方式都不会触发类的初始化，称为被动引用，接下来看下被动引用的几个例子：*/


//初始化阶段做的事就是给static变量赋予用户指定的值以及执行静态代码块。

    //注意这里初始化类与实例化对象的区别
public class TestClassInit1 {

    public static void main(String[] args) {
        Father1[] fathers= new Father1[10];//通过数组定义引用类，不会触发此类的初始化
        System.out.println("----------------");
        new Father1();//3、初始化一个类，发现其父类还没有初始化过的时候,会先初始化其父类
        System.out.println("----------------");
        //new Children1();
        System.out.println(Children1.tt);
        System.out.println(Children1.value);
    }
}

class Father1{
    public static int value = 123;
    int test = 1000;
    static {
        System.out.println("Father Inited");
    }
}

class Children1 extends Father1 {
    static int tt= 555;
    static {
        System.out.println("Children Inited");
    }
}
